package com.mycode.facade11;

import com.mycode.facade11.resolve.AbstractEncryptFacade;
import com.mycode.facade11.resolve.EncryptFacade;
import com.mycode.facade11.resolve.NewEncryptFacade;

import java.nio.charset.StandardCharsets;

/**
 * 外观模式：外部与一个子系统的通信通过一个统一的外观角色进行，为子系统中的一组接口提供一个一致的入口
 *         主要目的在于降低系统的复杂程度，还可以给客户端的使用带来极大的方法
 *
 *         往往系统中只需要一个外观类的实例，所以外观类可以是一个单例类，一个系统可以设计多个外观类，每个外观类负责和一些特定子系统交互，不能通过外观类为子系统增加新方法
 * 主要优点：
 *     1、对客户端屏蔽了子系统组件，减少客户端所需处理的对象数目
 *     2、实现了子系统和客户端之间的松耦合关系
 *     3、一个子系统的修改对其他子系统没有任何影响，子系统内部的变化也不会影响到外观对象
 *     4、只提供了访问子系统的统一入口，并不影响客户端直接使用子系统类
 *
 * 主要缺点：
 *     1、不能很好的限制客户端直接使用子系统类，如果对客户端访问子系统类做太多限制则减少了可变性和灵活性
 *     2、如果设计不当，增加新的子系统可能需要修改外观类的源代码，这违背了开闭原则
 *
 * 使用场景：
 *     1、腰围访问一系列复杂的子系统提供一个简单入口时
 *     2、客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦，提高子系统的独立性和可移植性
 *     3、在层次化结构中，可以使用外观模式定义系统中每一层的入口，层与层之间不直接产生联系，而通过外观类建立来呢西，降低层之间的耦合度
 */
public class Bootstrap {

    private static String ROOT_PATH = "src/main/java/com/mycode/facade11/";
    public static void main(String[] args) {
        EncryptFacade facade = new EncryptFacade();
        facade.fileEncrypt(ROOT_PATH + "resolve/src.txt", ROOT_PATH + "resolve/des.txt");

        System.out.println("--------------------------------------");
        AbstractEncryptFacade encryptFacade = new NewEncryptFacade();
        encryptFacade.fileEncrypt(ROOT_PATH + "resolve/src.txt", ROOT_PATH + "resolve/des.txt");
    }
}
